package com.yc.thread;

import java.util.Scanner;


/**
 * 同步方式:
 *  1. 同步方法
 *  2. 同步代码块
 *
 *  同步本质: 对某个资源( 对象 )进行锁定
 *
 *      1. 方法上的同步
 *             1) 同步的静态方法 锁定的是 当前类的类对象
 *             2) 同步的实例方法 锁定当前对象 ==> this
 *
 *     2. 代码块上的同步
 */
public class 并发问题 {

    // 计数器
    static long count = 0;

    long cnt = 0;


    // 同步方法
    static synchronized void add(){
        // 当前锁定的是   并发问题.class;  类对象
        count ++;
    }


    synchronized void add1(){
        // 锁定是 this
        cnt ++;
    }

    public static void main(String[] args) {
        for(int i=0; i<10;i++){
            new Thread("线程"+ i){
                public void run(){
                    for(int j = 0; j< 100000; j++){
                        synchronized (并发问题.class){
                            // wait 当前线程主动释放同步锁, 在此等待其他线程通知 (并发问题.class.notify or notifyAll)
                            // 生产着与消费者模式
                           /* try {
                                并发问题.class.wait();
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }*/

                            // 同步代码块
                            count ++;
                        }
                       // add();
                    }
                    System.out.println(Thread.currentThread().getName() + "执行结束");
                }
            }.start();
        }
        new Scanner(System.in).nextLine();
        System.out.println("结束 : " + count);
    }

}



